﻿using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using FarPoint.Win.Spread;
using FBWMS.Properties;

namespace FBWMS
{
    public partial class F_COM_CommonDefineXML : Form
    {
        /// <summary>
        /// iniファイル情報を格納するデータセット
        /// </summary>
        DataSet ds_Xml = new DataSet();

        /// <summary>
        /// サブフォームで選択された行のIndexを格納する変数
        /// </summary>
        private int int_Row = 0;

        /// <summary>
        /// iniファイルが更新されたか判定するフラグ
        /// </summary>
        private bool boo_IsUpdate = false;

        ////////////////////////////////////////////////////////////////////////////
        //
        //初期処理
        //
        ////////////////////////////////////////////////////////////////////////////
        public F_COM_CommonDefineXML()
        {            
            DataSet ds_Cmb = null;

            try
            {
                //待機画面表示
                G_CommonClassOther.G_Other_WaitForm(true);

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.F_COM_CommonDefineXML, "F_COM_CommonDefineXML");

                //初期処理
                InitializeComponent();

                //Xmlファイル読込
                this.P_Read_XmlFile();

                //ノードコンボボックス生成

                ds_Cmb = new DataSet();

                ds_Cmb.Tables.Add();

                ds_Cmb.Tables[0].Columns.Add();
                ds_Cmb.Tables[0].Columns.Add();

                int int_TableIndex = 0;

                for (int i = 0; i < this.ds_Xml.Tables.Count; ++i)
                {
                    if (G_CommonDefine.G_boo_XmlLogIn)
                    {
                        if (this.ds_Xml.Tables[i].TableName.ToString() != "Encrypt")
                        {
                            ds_Cmb.Tables[0].Rows.Add();
                            ds_Cmb.Tables[0].Rows[int_TableIndex][0] = this.ds_Xml.Tables[i].TableName.ToString();
                            ds_Cmb.Tables[0].Rows[int_TableIndex][1] = this.ds_Xml.Tables[i].TableName.ToString();

                            int_TableIndex++;
                        }
                    }
                    else
                    {
                        if (this.ds_Xml.Tables[i].TableName.ToString() == "Color")
                        {
                            ds_Cmb.Tables[0].Rows.Add();
                            ds_Cmb.Tables[0].Rows[int_TableIndex][0] = this.ds_Xml.Tables[i].TableName.ToString();
                            ds_Cmb.Tables[0].Rows[int_TableIndex][1] = this.ds_Xml.Tables[i].TableName.ToString();

                            int_TableIndex++;
                        }

                        this.cmb_XmlNode.Enabled = false;
                    }                   
                }

                if (!G_CommonClassControl.G_Control_SetData_ComboBox(cmb_XmlNode, ds_Cmb, 1, 0))
                {
                    MessageBox.Show(Resources.MakePrinterCombo);
                    return;
                }

                //サブフォームの交互色の設定
                //this.mr_F_COM_CommonDefineXML.AlternateMRowColor = true;
                //this.mr_F_COM_CommonDefineXML.MRowColorPattern = G_CommonDefine.G_col_MultiRowSheetBackColor;

                //ToolTipの設定
                G_CommonDefine.G_tt_ToolTip.RemoveAll();
                G_CommonDefine.G_tt_ToolTip.SetToolTip(this.btn_Update, "F5");
                G_CommonDefine.G_tt_ToolTip.SetToolTip(this.btn_Clear, "F11");

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.FCOMCommonDefineXML初期処理終了, "F_COM_CommonDefineXML");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.FCOMCommonDefineXML初期処理エラー + err.Message, "F_COM_CommonDefineXML");

                //エラーメッセージ表示
                MessageBox.Show(Resources.FCOMCommonDefineXML初期処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (ds_Cmb != null)
                {
                    ds_Cmb.Clear();
                }

                if (G_CommonDefine.G_F_COM_Waiting != null)
                {
                    //待機画面解除
                    G_CommonClassOther.G_Other_WaitForm(false);
                }
            }
        }

        #region イベントハンドラ ***********************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //更新釦クリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Update_Click(object sender, EventArgs e)
        {
            string str_Caption = string.Empty;
            string str_Message = string.Empty;
            try
            {
                if (!this.P_Check_InputValue())
                {
                    this.txt_Value.Focus();
                    return;
                }

                //if (DialogResult.Cancel == MessageBox.Show(Resources.更新しますよろしいてすか, Resources.確認, MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                //{
                //    return;
                //}
                str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_ConfirmUpdate);
                str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Check);
                if (DialogResult.Cancel == MessageBox.Show(str_Message, str_Caption, MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                {
                    return;
                }
                //待機画面表示
                G_CommonClassOther.G_Other_WaitForm(true);

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Update_Click, "btn_Update_Click");
                
                //更新処理
                this.P_Update();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnUpdateClick処理終了, "btn_Update_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnUpdateClick処理エラー + err.Message, "btn_Update_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnUpdateClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (G_CommonDefine.G_F_COM_Waiting != null)
                {
                    //待機画面解除
                    G_CommonClassOther.G_Other_WaitForm(false);
                }
            }
        }       

        ////////////////////////////////////////////////////////////////////////////
        //
        //クリアボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Clear_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Clear_Click, "btn_Clear_Click");

                this.cmb_XmlNode.SelectedIndex = 0;

                this.P_Init_EditPanel();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnClearClick処理終了, "btn_Clear_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnClearClick処理エラー + err.Message, "btn_Clear_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnClearClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //サブフォームセルクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        //private void mr_F_COM_CommonDefineXML_CellClick(object sender, GrapeCity.Win.ElTabelle.MClickEventArgs e)
        //{
        //    try
        //    {
        //        //ログ書込み
        //        G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, "mr_F_COM_CommonDefineXML_CellClick処理開始", "mr_F_COM_CommonDefineXML_CellClick");

        //        if (e.Position.Column.Equals(0))
        //        {
        //            //サブフォームセルクリック処理
        //            this.P_Sub_CellClick();
        //        }

        //        //ログ書込み
        //        G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "mr_F_COM_CommonDefineXML_CellClick処理終了", "mr_F_COM_CommonDefineXML_CellClick");
        //    }
        //    catch (Exception err)
        //    {
        //        //ログ書込み
        //        G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, "mr_F_COM_CommonDefineXML_CellClick処理エラー" + err.Message, "mr_F_COM_CommonDefineXML_CellClick");

        //        //エラーメッセージ表示
        //        MessageBox.Show("mr_F_COM_CommonDefineXML_CellClick処理エラー" + err.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //    }
        //}

        ////////////////////////////////////////////////////////////////////////////
        //
        //コンボボックス選択時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void cmb_XmlNode_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Cmb_XmlNode_SelectedIndexChanged, "cmb_XmlNode_SelectedIndexChanged");

                this.P_Display_SubForm();

                this.P_Init_EditPanel();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.CmbXmlNodeSelectedIndexChanged処理終了, "cmb_XmlNode_SelectedIndexChanged");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.CmbXmlNodeSelectedIndexChanged処理エラー + err.Message, "cmb_XmlNode_SelectedIndexChanged");

                //エラーメッセージ表示
                MessageBox.Show(Resources.CmbXmlNodeSelectedIndexChanged処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }       

        ////////////////////////////////////////////////////////////////////////////
        //
        //色選択釦クリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Color_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Color_Click, "btn_Color_Click");

                G_CommonDefine.G_Target_Color = this.txt_Value.Text;

                Form F_COM_Color = new F_COM_Color();

                F_COM_Color.ShowDialog();

                this.txt_Value.Text = G_CommonDefine.G_Target_Color;
                this.lbl_Color.BackColor = ColorTranslator.FromHtml(G_CommonDefine.G_Target_Color);

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnColorClick処理終了, "btn_Color_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnColorClick処理エラー + err.Message, "btn_Color_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnColorClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }  

        ////////////////////////////////////////////////////////////////////////////
        //
        //画面終了時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void F_COM_CommonDefineXML_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                //Xmlファイルが更新されていなかったらそのまま終了
                if (this.boo_IsUpdate == false)
                {
                    return;
                }

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Update_Click, "btn_Update_Click");
                //設定ファイルは変更されていますシステムに反映させますか
                if (DialogResult.Yes == MessageBox.Show(Resources.setConfigfilereflect, Resources.確認, MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {
                    G_CommonClassSystem.G_System_GetCommonDefine();

                    Settings.Default.ConnectionString = G_CommonClassSystem.G_System_GetConnectionString();
                }

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnUpdateClick処理終了, "btn_Update_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnUpdateClick処理エラー + err.Message, "btn_Update_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnUpdateClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //サブフォームセルダブルクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        //private void mr_F_COM_CommonDefineXML_CellDoubleClick(object sender, GrapeCity.Win.ElTabelle.MClickEventArgs e)
        //{
        //    int int_Current = this.mr_F_COM_CommonDefineXML.ActiveSheet.ActiveRowIndex + 1;
        //    int int_Total = this.mr_F_COM_CommonDefineXML.ActiveSheet.Rows.Count;

        //    MessageBox.Show(string.Format("現在のレコード : {0} / レコード総数 : {1}", int_Current, int_Total));
        //}
        
        #endregion *************************************************************************

        #region プライベート関数 ***********************************************************

        /// <summary>
        /// 更新処理
        /// </summary>
        private void P_Update()
        {
            string str_Column = this.cmb_XmlNode.SelectedValue.ToString();

            string str_SelKey = string.Format("/connection/{0}[{1}", str_Column, this.txt_Name.Text);

            string str_SelValue = this.ds_Xml.Tables[str_Column].Rows[0][this.ds_Xml.Tables[str_Column].Columns[this.int_Row].ToString()].ToString();

            string str_UpdValue = string.Empty;

            if (this.txt_Value.Visible == true)
            {
                str_UpdValue = this.txt_Value.Text;
            }
            else
            {
                if (this.chk_FG.Checked == true)
                {
                    str_UpdValue = "ON";
                }
                else
                {
                    str_UpdValue = "OFF";
                }
            }

            if (!G_CommonClassXML.G_XML_Update(@"", "CommonDefine.xml", str_SelKey, str_SelValue, this.txt_Name.Text, str_UpdValue))
            {
                MessageBox.Show(Resources.P_Update, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            this.P_Read_XmlFile();

            this.P_Display_SubForm();
            string str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_UpdateSuccess);
            MessageBox.Show(str_Message);

            this.P_Init_EditPanel();

            //更新フラグをON
            this.boo_IsUpdate = true;
        }        

        /// <summary>
        /// サブフォームデータ表示処理
        /// </summary>
        private void P_Display_SubForm()
        {
            //サブフォームの削除
            for (int i = this.mr_F_COM_CommonDefineXML.ActiveSheet.Rows.Count; i != 0; --i)
            {
                this.mr_F_COM_CommonDefineXML.ActiveSheet.RemoveRows(i - 1,1);
                //this.mr_F_COM_CommonDefineXML.ActiveSheet..MaxMRows = i - 1;
            }

            string str_ColumnName = this.cmb_XmlNode.SelectedValue.ToString();

            int int_TablesCount = this.ds_Xml.Tables[str_ColumnName].Columns.Count;

            for (int i = 0; i < int_TablesCount; ++i)
            {
                //this.mr_F_COM_CommonDefineXML.MaxMRows = this.mr_F_COM_CommonDefineXML.MaxMRows + 1;
                this.mr_F_COM_CommonDefineXML.ActiveSheet.Rows.Add(i , 1);
                //this.mr_F_COM_CommonDefineXML.ActiveSheet.Cells[i, 0].CellType =
                //    new FarPoint.Win.Spread.CellType.ButtonCellType();
                this.mr_F_COM_CommonDefineXML.ActiveSheet.Cells[i , 1].Value =
                    this.ds_Xml.Tables[str_ColumnName].Columns[i].ToString();
                this.mr_F_COM_CommonDefineXML.ActiveSheet.Cells[i , 2].Value =
                    this.ds_Xml.Tables[str_ColumnName].Rows[0][this.ds_Xml.Tables[str_ColumnName].Columns[i].ToString()]
                        .ToString();
                //this.mr_F_COM_CommonDefineXML.MRows[i][2, 0].Text = this.ds_Xml.Tables[str_ColumnName].Rows[0][this.ds_Xml.Tables[str_ColumnName].Columns[i].ToString()].ToString();
            }
        }

        /// <summary>
        /// 編集パネル初期化処理
        /// </summary>
        private void P_Init_EditPanel()
        {
            this.txt_Name.Text = string.Empty;

            this.chk_FG.Visible = false;
            this.btn_Color.Visible = false;
            this.lbl_Color.Visible = false;
            this.txt_Value.Location = new Point(94, 61);
            this.txt_Value.Size = new Size(288, 23);
            this.txt_Value.Visible = true;

            this.txt_Value.Text = string.Empty;
            this.txt_Value.Enabled = true;

            this.pnl_Edit.Enabled = false;

            this.cmb_XmlNode.Focus();
        }

        /// <summary>
        /// サブフォームセルクリック処理
        /// </summary>
        private void P_Sub_CellClick()
        {
            this.int_Row = this.mr_F_COM_CommonDefineXML.ActiveSheet.ActiveRowIndex;

            string str_Column = this.cmb_XmlNode.SelectedValue.ToString();

            this.txt_Name.Text = this.ds_Xml.Tables[str_Column].Columns[this.int_Row].ToString();

            this.pnl_Edit.Enabled = true;

            if (this.txt_Name.Text.Contains("FG"))
            {
                this.txt_Value.Visible = false;
                this.btn_Color.Visible = false;
                this.lbl_Color.Visible = false;
                this.chk_FG.Location = new Point(94, 63);
                this.chk_FG.Visible = true;

                if (this.ds_Xml.Tables[str_Column].Rows[0][this.ds_Xml.Tables[str_Column].Columns[this.int_Row].ToString()].ToString() == "ON")
                {
                    this.chk_FG.Checked = true;
                }
                else
                {
                    this.chk_FG.Checked = false;
                }

                this.pnl_Edit.Focus();
                this.chk_FG.Focus();
            }
            else if (this.txt_Name.Text.Contains("Color"))
            {
                this.chk_FG.Visible = false;
                this.btn_Color.Visible = true;
                this.lbl_Color.Visible = true;
                this.txt_Value.Location = new Point(94, 61);
                this.txt_Value.Size = new Size(166, 23);
                this.txt_Value.Visible = true;
                this.txt_Value.Text = this.ds_Xml.Tables[str_Column].Rows[0][this.ds_Xml.Tables[str_Column].Columns[this.int_Row].ToString()].ToString();
                this.txt_Value.Enabled = false;
                this.lbl_Color.BackColor = ColorTranslator.FromHtml(this.txt_Value.Text);

                this.pnl_Edit.Focus();
                this.btn_Color.Focus();
            }
            else
            {
                this.chk_FG.Visible = false;
                this.btn_Color.Visible = false;
                this.lbl_Color.Visible = false;
                this.txt_Value.Location = new Point(94, 61);
                this.txt_Value.Size = new Size(288, 23);
                this.txt_Value.Visible = true;
                this.txt_Value.Text = this.ds_Xml.Tables[str_Column].Rows[0][this.ds_Xml.Tables[str_Column].Columns[this.int_Row].ToString()].ToString();
                this.txt_Value.Enabled = true;

                this.pnl_Edit.Focus();
                this.txt_Value.Focus();
            }
        }

        /// <summary>
        /// Xmlファイル読込処理
        /// </summary>
        private void P_Read_XmlFile()
        {
            //データセット初期化
            this.ds_Xml.Clear();

            //xmlファイルパス
            string str_CommonDefinePath = G_CommonDefine.G_CommonPath + G_CommonDefine.CommonFile.CommonDefine;

            //xmlファイルを読み込んでデータセットに格納
            this.ds_Xml.ReadXml(str_CommonDefinePath);
        }

        #endregion *************************************************************************

        #region 入力チェック関数 ***********************************************************

        /// <summary>
        /// テキスト入力チェック
        /// </summary>
        /// <returns></returns>
        private bool P_Check_InputValue()
        {
            string str_Name = this.txt_Name.Text;
            string str_Value = this.txt_Value.Text;

            if (str_Name.Contains("Security"))
            {
                if (!this.txt_Value.Text.Equals("true") && !this.txt_Value.Text.Equals("false"))
                {
                    MessageBox.Show(Resources.P_Check_InputValue, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            if (str_Name.Contains("Size") || str_Name.Contains("Interval") || str_Name.Contains("Delay") || str_Name.Contains("Level"))
            {
                if (!G_CommonClassChk.G_Chk_Numeric(str_Value) || string.IsNullOrEmpty(str_Value))
                {
                    MessageBox.Show(Resources.半角数値を入力してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            if (str_Name.Contains("Link"))
            {
                if (!Path.GetExtension(str_Value).Equals(".lnk"))
                {
                    MessageBox.Show(Resources.を指定してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            if (str_Name.Contains("Pass"))
            {
                string str_Encrypt = G_CommonClassEncrypt.G_Encrypt_DecryptString(str_Value, G_CommonDefine.G_EncryptKey);

                if (string.IsNullOrEmpty(str_Encrypt))
                {
                    MessageBox.Show(Resources.ハスワートは暗号化したものを入力してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            return true;
        }

        #endregion *************************************************************************

        #region フォーム共通処理 ***********************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //ショートカットキー処理
        //
        ////////////////////////////////////////////////////////////////////////////
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (this.cc_ShortcutKeyHelper1.PerformClickByKeys(keyData))
            {
                return true;
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        ////////////////////////////////////////////////////////////////////////////
        //フォームKeyDown時処理
        //(エンターを押した際に次のコントロールに移動する。)
        //(フォームの『KeyPreview』を『true』にすること)
        ////////////////////////////////////////////////////////////////////////////
        private void F_COM_CommonDefineXML_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!e.Control)
                {
                    this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
                }
            }
        }                                            

        #endregion *************************************************************************        

        private void mr_F_COM_CommonDefineXML_ButtonClicked(object sender, EditorNotifyEventArgs e)
        {
            P_Sub_CellClick();
        }
    }
}